//
//  ZegoLiveStreamingManagerDelegate.swift
//  ZegoUIKitPrebuiltLiveStreaming
//
//  Created by zego on 2024/1/18.
//

import Foundation

/// 定义了一系列用于处理直播相关事件的委托方法，实现该协议的类可以监听并响应直播过程中的各种事件
@objc public protocol ZegoLiveStreamingManagerDelegate: AnyObject {
// MARK: - 连麦
    
    /// 当接收到连麦申请请求时调用此方法
    /// - Parameter inviter: 发起连麦申请的用户信息
    @objc optional func onIncomingCohostRequest(inviter: ZegoUIKitUser)
    
    /// 当接收到邀请连麦的请求时调用此方法
    /// - Parameters:
    ///   - inviter: 发起邀请连麦的用户信息
    ///   - invitationID: 邀请的唯一标识符
    @objc optional func onIncomingInviteToCohostRequest(inviter: ZegoUIKitUser, invitationID: String)
    
    /// 当接收到移除连麦者的请求时调用此方法
    /// - Parameter inviter: 发起移除连麦者请求的用户信息
    @objc optional func onIncomingRemoveCohostRequest(inviter: ZegoUIKitUser)
    
    /// 当连麦申请被接受时调用此方法
    /// - Parameters:
    ///   - invitee: 接受连麦申请的用户信息
    ///   - data: 附带的相关数据，可能包含自定义信息
    @objc optional func onIncomingAcceptCohostRequest(invitee: ZegoUIKitUser, data: String?)
    
    /// 当连麦申请被取消时调用此方法
    /// - Parameters:
    ///   - inviter: 取消连麦申请的用户信息
    ///   - data: 附带的相关数据，可能包含取消原因等信息
    @objc optional func onIncomingCancelCohostRequest(inviter: ZegoUIKitUser, data: String?)
    
    /// 当邀请连麦被取消时调用此方法
    /// - Parameters:
    ///   - inviter: 取消邀请连麦的用户信息
    ///   - data: 附带的相关数据，可能包含取消原因等信息
    @objc optional func onIncomingCancelCohostInvite(inviter: ZegoUIKitUser, data: String?)
    
    /// 当连麦申请被拒绝时调用此方法
    /// - Parameters:
    ///   - invitee: 拒绝连麦申请的用户信息
    ///   - data: 附带的相关数据，可能包含拒绝原因等信息
    @objc optional func onIncomingRefuseCohostRequest(invitee: ZegoUIKitUser, data: String?)
    
    /// 当邀请连麦被拒绝时调用此方法
    /// - Parameters:
    ///   - invitee: 拒绝邀请连麦的用户信息
    ///   - data: 附带的相关数据，可能包含拒绝原因等信息
    @objc optional func onIncomingRefuseCohostInvite(invitee: ZegoUIKitUser, data: String?)
    
    /// 当连麦申请超时未得到响应时调用此方法
    /// - Parameters:
    ///   - inviter: 发起连麦申请的用户信息
    ///   - data: 附带的相关数据，可能包含申请相关信息
    @objc optional func onIncomingCohostRequestTimeOut(inviter: ZegoUIKitUser, data: String?)
    
    /// 当邀请连麦超时未得到响应时调用此方法
    /// - Parameters:
    ///   - inviter: 发起邀请连麦的用户信息
    ///   - data: 附带的相关数据，可能包含邀请相关信息
    @objc optional func onIncomingCohostInviteTimeOut(inviter: ZegoUIKitUser, data: String?)
    
    /// 当邀请连麦的响应超时未返回时调用此方法
    /// - Parameters:
    ///   - invitees: 被邀请连麦的用户列表
    ///   - data: 附带的相关数据，可能包含邀请相关信息
    @objc optional func onIncomingCohostInviteResponseTimeOut(invitees: [ZegoUIKitUser], data: String?)
    
    /// 当连麦申请的响应超时未返回时调用此方法
    /// - Parameters:
    ///   - invitees: 申请连麦的用户列表
    ///   - data: 附带的相关数据，可能包含申请相关信息
    @objc optional func onIncomingCohostRequestResponseTimeOut(invitees: [ZegoUIKitUser], data: String?)
    
    // MARK: - PK
    
    /// 当接收到 PK 请求时调用此方法
    /// - Parameters:
    ///   - requestID: PK 请求的唯一标识符
    ///   - anotherHostUser: 发起 PK 请求的另一个房主的用户信息
    ///   - anotherHostLiveID: 发起 PK 请求的另一个房主的直播 ID
    ///   - customData: 附带的自定义数据，可能包含 PK 规则等信息
    @objc optional func onIncomingPKRequestReceived(requestID: String, anotherHostUser: ZegoUIKitUser, anotherHostLiveID: String, customData: String?)
    
    /// 当接收到恢复 PK 的请求时调用此方法
    /// - Parameter requestID: 恢复 PK 请求的唯一标识符
    @objc optional func onIncomingResumePKRequestReceived(requestID: String)
    
    /// 当 PK 请求被取消时调用此方法
    /// - Parameters:
    ///   - anotherHostLiveID: 取消 PK 请求的另一个房主的直播 ID
    ///   - anotherHostUser: 取消 PK 请求的另一个房主的用户信息
    ///   - customData: 附带的自定义数据，可能包含取消原因等信息
    @objc optional func onIncomingPKRequestCancelled(anotherHostLiveID: String, anotherHostUser: ZegoUIKitUser, customData: String?)
    
    /// 当发出的 PK 请求被接受时调用此方法
    /// - Parameters:
    ///   - anotherHostLiveID: 接受 PK 请求的另一个房主的直播 ID
    ///   - anotherHostUser: 接受 PK 请求的另一个房主的用户信息
    ///   - customData: 附带的自定义数据，可能包含接受的相关信息
    @objc optional func onOutgoingPKRequestAccepted(anotherHostLiveID: String, anotherHostUser: ZegoUIKitUser, customData: String?)
    
    /// 当发出的 PK 请求被拒绝时调用此方法
    /// - Parameters:
    ///   - reason: 拒绝 PK 请求的原因代码
    ///   - anotherHostUser: 拒绝 PK 请求的另一个房主的用户信息
    @objc optional func onOutgoingPKRequestRejected(reason: Int, anotherHostUser: ZegoUIKitUser)
    
    /// 当接收到的 PK 请求超时未得到处理时调用此方法
    /// - Parameters:
    ///   - requestID: 超时的 PK 请求的唯一标识符
    ///   - anotherHostUser: 发起超时 PK 请求的另一个房主的用户信息
    @objc optional func onIncomingPKRequestTimeout(requestID: String, anotherHostUser: ZegoUIKitUser)
    
    /// 当发出的 PK 请求超时未得到响应时调用此方法
    /// - Parameters:
    ///   - requestID: 超时的 PK 请求的唯一标识符
    ///   - anotherHost: 接收超时 PK 请求的另一个房主的用户信息
    @objc optional func onOutgoingPKRequestTimeout(requestID: String, anotherHost: ZegoUIKitUser)
    
    /// 当 PK 对战开始时调用此方法
    /// - Parameters:
    ///   - roomID: PK 所在的房间 ID
    ///   - userID: 参与 PK 的用户 ID
    @objc optional func onPKStarted(roomID: String, userID: String)
    
    /// 当 PK 对战结束时调用此方法
    @objc optional func onPKEnded()
    
    /// 当 PK 视图可用时调用此方法
    @objc optional func onPKViewAvaliable()
    
    // MARK: - 状态变化
    
    /// 当本地房主的摄像头状态发生变化时调用此方法
    /// - Parameter isOn: 摄像头是否开启的状态，true 表示开启，false 表示关闭
    @objc optional func onLocalHostCameraStatus(isOn: Bool)
    
    /// 当另一个房主的摄像头状态发生变化时调用此方法
    /// - Parameter isOn: 摄像头是否开启的状态，true 表示开启，false 表示关闭
    @objc optional func onAnotherHostCameraStatus(isOn: Bool)
    
    // MARK: - 连接状态
    
    /// 当另一个房主正在重连时调用此方法
    @objc optional func onAnotherHostIsReconnecting()
    
    /// 当另一个房主重连成功时调用此方法
    @objc optional func onAnotherHostIsConnected()
    
    /// 当本地房主正在重连时调用此方法
    @objc optional func onHostIsReconnecting()
    
    /// 当本地房主重连成功时调用此方法
    @objc optional func onHostIsConnected()
    
    // MARK: - 视频流
    
    /// 当混流任务失败时调用此方法
    /// - Parameter errorCode: 混流任务失败的错误代码
    @objc optional func onMixerStreamTaskFail(errorCode: Int)
    
    /// 当开始播放混流时调用此方法
    @objc optional func onStartPlayMixerStream()
    
    /// 当停止播放混流时调用此方法
    @objc optional func onStopPlayMixerStream()
    
    /// 当另一个房主的音频被静音或取消静音时调用此方法
    /// - Parameters:
    ///   - userID: 被操作的房主的用户 ID
    ///   - mute: 音频是否被静音的状态，true 表示静音，false 表示取消静音
    @objc optional func onOtherHostMuted(userID: String, mute: Bool)
    
}
